From: Keir Fraser Date: Tue, 22 Apr 2008 10:46:41 +0000 (+0100) Subject: x86 iommu: Better synchronisation on dirq_mask. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14215^2~145 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=a8add4da193a45f0486cbe01f0ab2a48938d9d7a;p=xen.git x86 iommu: Better synchronisation on dirq_mask. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/hvm/svm/intr.c b/xen/arch/x86/hvm/svm/intr.c index 4b3dcd33ad..3463ac42a6 100644 --- a/xen/arch/x86/hvm/svm/intr.c +++ b/xen/arch/x86/hvm/svm/intr.c @@ -109,8 +109,10 @@ static void svm_dirq_assist(struct vcpu *v) irq < NR_IRQS; irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) ) { + if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) ) + continue; + stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]); - clear_bit(irq, &hvm_irq_dpci->dirq_mask); list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list ) { diff --git a/xen/arch/x86/hvm/vmx/intr.c b/xen/arch/x86/hvm/vmx/intr.c index dc47430a63..3fcfc52175 100644 --- a/xen/arch/x86/hvm/vmx/intr.c +++ b/xen/arch/x86/hvm/vmx/intr.c @@ -118,8 +118,10 @@ static void vmx_dirq_assist(struct vcpu *v) irq < NR_IRQS; irq = find_next_bit(hvm_irq_dpci->dirq_mask, NR_IRQS, irq + 1) ) { + if ( !test_and_clear_bit(irq, &hvm_irq_dpci->dirq_mask) ) + continue; + stop_timer(&hvm_irq_dpci->hvm_timer[irq_to_vector(irq)]); - clear_bit(irq, &hvm_irq_dpci->dirq_mask); list_for_each_entry ( digl, &hvm_irq_dpci->mirq[irq].digl_list, list ) {